<?php
require APPPATH."/controllers/Common.php";

class WebPay extends Common { 
	
	 public function do_alipay($code=0,$msg='', $fee=0)
    {
		if(!(
			$code && $msg && $fee
		)){
			$code = $this->req('code');
			$msg = $this->req('msg');
			$fee = $this->req('fee');
		}
        $this->common_vendor('alipay_Aop.aop.AopClient');
        $this->common_vendor('Alipay.Corefunction');
        $this->common_vendor('Alipay.Md5function');
        $this->common_vendor('Alipay.Notify');
        $this->common_vendor('Alipay.Submit');
        $alipay_config = array(
            'partner' => $this->alipay_conf('alipay_partner'),   //这里是你在成功申请支付宝接口后获取到的PID；
            'key' => $this->alipay_conf('alipay_key'),//这里是你在成功申请支付宝接口后获取到的Key 
            'sign_type' => strtoupper('RSA'),
            'input_charset' => 'utf-8',
            'cacert' => getcwd() . '\\cacert.pem',
            'transport' => 'http',
        );
        //支付成功跳转路径，同步通知地址 
        $return_url = ''; //页面跳转同步通知页面路径
       
        //异步通知地址  需http://格式的完整路径，不允许加?id=123这类自定义参数
        $notify_url = ''; //服务器异步通知页面路径

        $payment_type = "1"; //支付类型 //必填，不能修改
        $seller_email = $this->alipay_conf('alipay_seller_email');//卖家支付宝帐户必填
        $out_trade_no = $code;//商户订单号 通过支付页面的表单进行传递，注意要唯一！
        $subject = $msg?$msg:"对" . $code . '交易号付款';  //订单名称 //必填 通过支付页面的表单进行传递
        $total_fee = $fee;   //付款金额  //必填 通过支付页面的表单进行传递
        $body = '订单付款';
        $anti_phishing_key = "";//防钓鱼时间戳 //若要使用请调用类文件submit中的query_timestamp函数
        $user_IP = isset($_SERVER["HTTP_VIA"]) ? $_SERVER["HTTP_X_FORWARDED_FOR"] : $_SERVER["REMOTE_ADDR"];
        $user_IP = isset($user_IP) ? $user_IP : $_SERVER["REMOTE_ADDR"];
        $exter_invoke_ip = $user_IP; //客户端的IP地址
        /************************************************************/
        $extra_common_param = '1010101';//test
        //构造要请求的参数数组，无需改动
        $parameter = array(
            "service" => "create_direct_pay_by_user",
            "partner" => trim($this->alipay_conf('alipay_partner')),
            "payment_type" => $payment_type,
            "notify_url" => $notify_url,
            "return_url" => $return_url,
            "seller_email" => $seller_email,
            "out_trade_no" => $out_trade_no,
            "subject" => $subject,
            "total_fee" => $total_fee,
            "body" => $body,
            "extra_common_param" => $extra_common_param,
            "anti_phishing_key" => $anti_phishing_key,
            "exter_invoke_ip" => $exter_invoke_ip,
            "_input_charset" => trim(strtolower($alipay_config['input_charset']))
        );
        //建立请求
        /** @var  \AlipaySubmit $alipaySubmit */
        $alipaySubmit = new AlipaySubmit($alipay_config);
        $html_text = $alipaySubmit->buildRequestForm($parameter, "post", "确认");
        echo $html_text;
    }
	
	
	 public function do_weixin($code=0,$msg='', $fee = 1)
    {
		if(!(
			$code && $msg && $fee
		)){
			$code = $this->req('code');
			$msg = $this->req('msg');
			$fee = $this->req('fee');
		}
        define("WEIXIN_APPID", HAO_WEIXIN_APPID);
        define("WEIXIN_APPSECRET", HAO_WEIXIN_APPSECRET);
        define("WEIXIN_MCHID", HAO_WEIXIN_MCHID);
        define("WEIXIN_KEY", HAO_WEIXIN_KEY);
        $this->common_vendor('WxPayPubHelper.WxPaypubconfig');
        $this->common_vendor('WxPayPubHelper.SDKRuntimeException');
        $this->common_vendor('WxPayPubHelper.WxPayPubHelper');
        $this->common_vendor('phpqrcode.qrlib');
        $fee = $fee * 100;
		$notify_url = "http://wwwxtaoyuan.com/weixin";
        //使用统一支付接口
        $unifiedOrder = new \UnifiedOrder_pub();
        $unifiedOrder->setParameter("body", $msg?$msg:"订单付款");//商品描述
        $unifiedOrder->setParameter("out_trade_no", sprintf("%s",$code));//商户订单号
        $unifiedOrder->setParameter("total_fee", $fee);//总金额
        $unifiedOrder->setParameter("notify_url",$notify_url);//通知地址
        $unifiedOrder->setParameter("trade_type", "NATIVE");//交易类型
        //非必填参数，商户可根据实际情况选填
        //获取统一支付接口结果
        $unifiedOrderResult = $unifiedOrder->getResult();
        $code_url = '';
        //print_r($unifiedOrderResult);
        //商户根据实际情况设置相应的处理流程
        if ($unifiedOrderResult["return_code"] == "FAIL") {
            //商户自行增加处理流程
             exit("通信出错：" . $unifiedOrderResult['return_msg']);
        } elseif ($unifiedOrderResult["result_code"] == "FAIL") {
            //商户自行增加处理流程
             exit("错误代码：" . $unifiedOrderResult['err_code'] . "<br>" + "错误代码描述：" . $unifiedOrderResult['err_code_des']);
        } elseif ($unifiedOrderResult["code_url"] != NULL) {
            // 从统一支付接口获取到code_url
            $code_url = $unifiedOrderResult["code_url"];
            // 商户自行增加处理流程
        }
        echo $code_url;
    }

    /**
     * 支付宝支付成功回调
     */
    function alipay_callback(){
            $this->common_vendor('alipay_Aop.aop.AopClient');
            $aop = new \AopClient();
            $aop->alipayrsaPublicKey = $this->alipay_conf("alipay_rsa_public");
            if (isset($_POST["sign"])) {
                $flag = $aop->rsaCheckV1($_POST, NULL, "RSA");

                if ($flag) {
                    //买家支付成功，开始修改订单的支付方式和付款状态

                    echo "支付成功";
                }
            }

    }
    /**
     * 微信支付成功回调
     */
    function weixin_callback(){
            define("WEIXIN_APPID", HAO_WEIXIN_APPID);
            define("WEIXIN_APPSECRET", "");
            define("WEIXIN_MCHID", HAO_WEIXIN_MCHID);
            define("WEIXIN_KEY", HAO_WEIXIN_KEY);
            $this->common_vendor('WxPayPubHelper.WxPaypubconfig');
            $this->common_vendor('WxPayPubHelper.SDKRuntimeException');
            $this->common_vendor('WxPayPubHelper.WxPayPubHelper');
            //使用通用通知接口
            $notify = new \Notify_pub();

            //存储微信的回调
            $xml = isset($GLOBALS['HTTP_RAW_POST_DATA']) ? $GLOBALS['HTTP_RAW_POST_DATA'] : exit("非法访问");
            $notify->saveData($xml);

            //验证签名，并回应微信。
            //对后台通知交互时，如果微信收到商户的应答不是成功或超时，微信认为通知失败，
            //微信会通过一定的策略（如30分钟共8次）定期重新发起通知，
            //尽可能提高通知的成功率，但微信不保证通知最终能成功。
            if ($notify->checkSign() == FALSE) {
                $notify->setReturnParameter("return_code", "FAIL");//返回状态码
                $notify->setReturnParameter("return_msg", "签名失败");//返回信息
            } else {
                $notify->setReturnParameter("return_code", "SUCCESS");//设置返回码
            }
            $returnXml = $notify->returnXml();
            echo $returnXml;

            //==商户根据实际情况设置相应的处理流程，此处仅作举例=======
            //$log_name="notify_url.log";//log文件路径
            //$this->log_result($log_name,"【接收到的notify通知】:\n".$xml."\n");

            if ($notify->checkSign() == TRUE) {
                if ($notify->data["return_code"] == "FAIL") {
                    //此处应该更新一下订单状态，商户自行增删操作
                } elseif ($notify->data["result_code"] == "FAIL") {
                    //此处应该更新一下订单状态，商户自行增删操作
                } else {
                    # 支付成功后的处理
                    $code = $this->req("code");
                    $this->load->model('Order');
                    $order = Order::findByCode($code);
                    if($order){
                        Order::save([
                            "callback"=>serialize($_REQUEST)
                        ],"code = $code");
                    }else{
                        Order::save([
                            "title"=>"未知订单返回结果",
                            "callback"=>serialize($_REQUEST)
                        ]);
                    }
                }
                echo "success";
            }
    }

}
